package study07;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;

public class Java01_Reflect {
    public static void main(String[] args) throws Exception {
//        反射

//        多态
        User user = new Child();
        user.test1();
//        user.test2();

//        类对象
        Class<? extends User> aClass = user.getClass();

//        获取类的名称
        System.out.println(aClass.getName()); // 获取类的完整名称（包含包名）
        System.out.println(aClass.getSimpleName()); // 获取类名

//        获取类的父类
        Class<?> superclass = aClass.getSuperclass();
        System.out.println(superclass);

//        获取类的接口
        Class<?>[] interfaces = aClass.getInterfaces();
        System.out.println(interfaces);

//        获取类的属性
        Field f1 = aClass.getField("xxxx"); // 只能取 public 的
        Field f2 = aClass.getDeclaredField("xxxx"); // 可以取所有的

        Field[] fields = aClass.getFields(); // 获取所有的 public 属性
        Field[] declaredFields = aClass.getDeclaredFields(); // 获取所有的属性

//        获取类的方法 基本与获取属性的一致
        Method m1 = aClass.getMethod("xxxx");
        Method m2 = aClass.getDeclaredMethod("xxxx");

        Method[] methods = aClass.getMethods();
        Method[] declaredMethods = aClass.getDeclaredMethods();

//        构造方法 与获取属性方法的都有 getDeclaredXXXXX
        Constructor<? extends User> constructor = aClass.getConstructor();
        Constructor<?>[] constructors = aClass.getConstructors();

//        获取权限（修饰符） 多个修饰符会融合成一个修饰符
        int modifiers = aClass.getModifiers();
        boolean aPrivate = Modifier.isPrivate(modifiers);
    }
}

class User {
    public void test1() {
        System.out.println("test1...");
    }
}

class Child extends User {
    public void test2() {
        System.out.println("test2...");
    }
}
